/**
 * 导出JSON对象为文件。
 * 
 * 该函数提供了一种将JavaScript对象序列化为JSON格式，并下载为文件的功能。
 * 主要用于在浏览器环境中导出数据，以便用户可以本地保存。
 * 
 * @param json 要导出的JSON对象。
 * @param fileName 导出文件的名称。
 */
export const exportJson = (json: any, fileName: string) => {
    // 将json对象转换为JSON字符串。
	const data = JSON.stringify(json)
    // 创建一个Blob对象，用于存储JSON数据。
	const blob = new Blob([data], { type: 'application/json' })
    // 创建一个URL对象，用于临时访问Blob对象。
	const url = URL.createObjectURL(blob)
    // 创建一个<a>元素，用于触发文件下载。
	const link = document.createElement('a')
    // 设置<a>元素的链接地址为Blob对象的URL。
	link.href = url
    // 设置<a>元素的下载属性为指定的文件名。
	link.download = fileName
    // 模拟点击<a>元素，触发文件下载。
	link.click()
    // 释放Blob对象的URL，避免内存泄漏。
	URL.revokeObjectURL(url)
}

/**
 * 导入JSON文件并返回其解析后的对象。
 * 
 * 此函数封装了FileReader接口的使用，用于读取指定的JSON文件并解析为JavaScript对象。
 * 它返回一个Promise，成功时解析为JSON对象，失败时拒绝并返回错误事件。
 * 
 * @param file 要导入的JSON文件，是一个File对象。
 * @returns 返回一个Promise，解析为导入的JSON数据，或在读取或解析过程中出错时拒绝。
 */
export const importJson = (file: File) => {
	return new Promise((resolve, reject) => {
		// 创建一个新的FileReader对象来读取文件。
		const reader = new FileReader()

		// 定义文件读取成功时的处理函数。
		reader.onload = (event) => {
			// 从事件目标中获取读取的文本，并解析为JSON对象。
			const json = JSON.parse(event.target?.result as string)
			// 解析成功时，解决Promise并返回JSON对象。
			resolve(json)
		}

		// 定义文件读取失败时的处理函数。
		reader.onerror = (event) => {
			// 读取或解析失败时，拒绝Promise并返回错误事件。
			reject(event)
		}

		// 开始读取文件，将其作为文本读取。
		reader.readAsText(file)
	})
}
